﻿/**
 * @author rayzhang
 * @details vector tools
 */
//module;
#include <QVector>
#include <ranges>
#include "../libflow_global.h"
//export module libflow.vector_utils;

/*export */namespace flow
{

// 两个向量相加
template <typename T>
QVector<T> plus(const QVector<T>& a, const QVector<T>& b)
{
    const auto len = std::min(a.size(), b.size());
    QVector<T> c(len);
    std::ranges::transform(a | std::views::take(len), b | std::views::take(len), c.begin(), std::plus());
    return c;
}

// 两个向量减
template <typename T>
QVector<T> minus(const QVector<T>& a, const QVector<T>& b)
{
    const auto len = std::min(a.size(), b.size());
    QVector<T> c(len);
    std::ranges::transform(a | std::views::take(len), b | std::views::take(len), c.begin(), std::minus());
    return c;
}

// 两个向量乘
template <typename T>
QVector<T> multiplies(const QVector<T>& a, const QVector<T>& b)
{
    const auto len = std::min(a.size(), b.size());
    QVector<T> c(len);
    std::ranges::transform(a | std::views::take(len), b | std::views::take(len), c.begin(), std::multiplies());
    return c;
}

// 两个向量除
template <typename T>
QVector<double> divides(const QVector<T>& a, const QVector<T>& b)
{
    const auto len = std::min(a.size(), b.size());
    QVector<T> c(len);
    std::ranges::transform(a | std::views::take(len), b | std::views::take(len), c.begin(), std::divides());
    return c;
}

// using namespace std::ranges;
// return (views::zip(values, w) | views::transform([](auto pair) {
//             return std::get<0>(pair) * std::get<1>(pair);
//         }) |
//         to<QVector<double>>());
} // namespace flow